import datetime
import functools


# 日志装饰器
def log_decorator(f):
    # 定义函数装饰器
    @functools.wraps(f)  # 使用内置的装饰器functools.wraps,它会保留原函数的元信息(也就是将原函数的元信息,拷贝到对应的装饰器函数里)
    def wrapper(*args, **kwargs):
        # 获取当前时间
        cur_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        # 获取函数名
        func_name = f.__name__
        # 在函数执行前打印日志
        print(f'【{cur_time}】exec function: {func_name}')
        # 实际执行函数
        f(*args, **kwargs)

    # 返回函数装饰器
    return wrapper


# 定义普通函数,并使用装饰器
@log_decorator
def print_msg(msg):
    print(f'got message: {msg}')


if __name__ == '__main__':
    print_msg('hello')
    print(f'func name is: {print_msg.__name__}')

    # @log_decorator是一种语法糖,实际的执行效果为:
    # greeting = log_decorator(greeting)
    # greeting()
